From: Florian Müllner Date: Wed, 4 Mar 2020 13:27:54 +0000 (+0100) Subject: shell/tray-manager: Delay managing screen if necessary X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~761^2^2~10 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=4ff94f80a00d0e1e0a9e48df5c390cdf98a476b3;p=gnome-shell.git shell/tray-manager: Delay managing screen if necessary Now that Xwayland startup is asynchronous, the function may be called before X11 is available, resulting in a crash. Fix this by only managing the tray immediately if we already have an X11 display, and wait for it to be set up otherwise. Likewise, unmanage the screen when X11 becomes unavailable. https://gitlab.gnome.org/GNOME/gnome-shell/issues/2308 --- diff --git a/src/shell-tray-manager.c b/src/shell-tray-manager.c index ea7066be6..e23179f4e 100644 --- a/src/shell-tray-manager.c +++ b/src/shell-tray-manager.c @@ -218,6 +218,9 @@ shell_tray_manager_style_changed (StWidget *theme_widget, StThemeNode *theme_node; StIconColors *icon_colors; + if (manager->priv->na_manager == NULL) + return; + theme_node = st_widget_get_theme_node (theme_widget); icon_colors = st_theme_node_get_icon_colors (theme_node); na_tray_manager_set_colors (manager->priv->na_manager, @@ -225,15 +228,30 @@ shell_tray_manager_style_changed (StWidget *theme_widget, &icon_colors->error, &icon_colors->success); } +static void +shell_tray_manager_manage_screen_internal (ShellTrayManager *manager) +{ + shell_tray_manager_ensure_resources (manager); + na_tray_manager_manage_screen (manager->priv->na_manager); +} + void shell_tray_manager_manage_screen (ShellTrayManager *manager, StWidget *theme_widget) { + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + g_set_weak_pointer (&manager->priv->theme_widget, theme_widget); - shell_tray_manager_ensure_resources (manager); + if (meta_display_get_x11_display (display) != NULL) + shell_tray_manager_manage_screen_internal (manager); - na_tray_manager_manage_screen (manager->priv->na_manager); + g_signal_connect_object (display, "x11-display-setup", + G_CALLBACK (shell_tray_manager_manage_screen_internal), + manager, G_CONNECT_SWAPPED); + g_signal_connect_object (display, "x11-display-closing", + G_CALLBACK (shell_tray_manager_release_resources), + manager, G_CONNECT_SWAPPED); g_signal_connect_object (theme_widget, "style-changed", G_CALLBACK (shell_tray_manager_style_changed), @@ -244,6 +262,10 @@ shell_tray_manager_manage_screen (ShellTrayManager *manager, void shell_tray_manager_unmanage_screen (ShellTrayManager *manager) { + MetaDisplay *display = shell_global_get_display (shell_global_get ()); + + g_signal_handlers_disconnect_by_data (display, manager); + if (manager->priv->theme_widget != NULL) { g_signal_handlers_disconnect_by_func (manager->priv->theme_widget,